package com.netty8018.userguide;

import cn.hutool.core.util.ReferenceUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;

/**
 * @author liyanhao
 * @Date 2023-02-03 13:21
 * https://netty.io/wiki/user-guide-for-4.x.html
 * 编写丢失服务器
 * 对接受的信息不进行处理 直接丢失
 */
//DiscardServerHandler扩展 ChannelInboundHandlerAdapter，
// 它是 ChannelInboundHandler 的实现。
// ChannelInboundHandler 提供了各种可以重写的事件处理程序方法。
// 现在，扩展 ChannelInboundHandlerAdapter 就足够了，而不是自己实现处理程序接口。
public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //Discard the revceived data silently
        ByteBuf in = (ByteBuf) msg;
        try{
            System.out.println(in.toString(io.netty.util.CharsetUtil.US_ASCII));
        }finally {
            ReferenceCountUtil.release(msg);
        }
        //若要实现协议，处理程序必须忽略收到的消息。ByteBuf 是一个引用计数的对象，必须通过该方法显式释放。请记住，
        // 处理程序负责释放传递给处理程序的任何引用计数对象。
        // 通常，处理程序方法的实现方式如下：DISCARDrelease()channelRead()
//        ((ByteBuf) msg).release();
    }

    //当 Netty 由于 I/O 错误引发异常或处理程序实现由于处理事件时引发异常而引发异常时，
    // 将使用 Throwable 调用事件处理程序方法。在大多数情况下，应记录捕获的异常，
    // 并在此处关闭其关联的通道，尽管此方法的实现可能会有所不同，
    // 具体取决于要执行的操作来处理异常情况。
    // 例如，您可能希望在关闭连接之前发送包含错误代码的响应消息。exceptionCaught()
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

}
